#include <bits/stdc++.h>

using namespace std;

// 会议室II
// 给你一个会议时间安排的数组 intervals
// 每个会议时间都会包括开始和结束的时间intervals[i]=[starti, endi]
// 返回所需会议室的最小数量
// 测试链接 : https://leetcode.cn/problems/meeting-rooms-ii/
// 这题就是讲解027，题目2，最多线段重合问题
// 测试链接 : https://www.nowcoder.com/practice/1ae8d0b6bb4e4bcdbf64ec491f63fc37

class Solution 
{
public:
    int minMeetingRooms(vector<vector<int>>& meeting) 
    {
    	int n = meeting.size();
    	sort(meeting.begin(), meeting.end(),[&](auto a, auto b){
            return a[0] < b[0];
    	});
        int ans = 0;
        priority_queue<int, vector<int>, greater<int>> heap; // 小根堆
        for(int i = 0; i < n; ++i)
        {
            while(!heap.empty() && heap.top() <= meeting[i][0]) heap.pop();
            heap.push(meeting[i][1]);
            // 堆中存储的是时间冲突的会议的结束时间
            ans = max(ans, (int)heap.size()); 
        }
        return ans;
    }
};